package com.etl.enums;

/**
 * 商品类型枚举
 *
 * @author: chenfenghai
 * @version: 1.0
 * @date: 2020-10-30 16:14
 */
public enum GoodsTypeEnum {
    /**
     * 商品类型，1：卖品
     */
    GOODS((byte) 1, "卖品", "GOODS_PRICE", "GOODS_COUNT"),
    /**
     * 商品类型，2：影票
     */
    FILM_TICKET((byte) 2, "影票", "FILM_TICKET_PRICE", "FILM_TICKET_COUNT"),
    /**
     * 商品类型，9：网络代售费
     */
    NET_SERVICE((byte) 9, "代售费", "NET_SERVICE_PRICE", "NET_SERVICE_COUNT"),
    /**
     * 商品类型，7：增值服务费
     */
    ADD_SERVICE((byte) 7, "服务费", "ADD_SERVICE_PRICE", "ADD_SERVICE_COUNT"),
    /**
     * 商品类型，3：会员
     */
    MEMBER((byte) 3, "会员", "MEMBER_PRICE", "MEMBER_COUNT"),

    /**
     * 商品类型，4：票券
     */
    COUPON((byte) 4, "票券", "COUPON_PRICE", "COUPON_COUNT");

    /**
     * 编码
     */
    private final Byte code;

    /**
     * 显示文本
     */
    private final String text;

    /**
     * 价格字段
     */
    private final String priceField;

    /**
     * 数量字段
     */
    private final String countField;

    GoodsTypeEnum(Byte code, String text, String priceField, String countField) {
        this.code = code;
        this.text = text;
        this.priceField = priceField;
        this.countField = countField;
    }

    /**
     * 获取编码
     *
     * @return code
     */
    public Byte getCode() {
        return code;
    }

    /**
     * 获取显示文本
     *
     * @return text
     */
    public String getText() {
        return text;
    }

    /**
     * 获取价格字段
     *
     * @return priceField
     */
    public String getPriceField() {
        return priceField;
    }

    /**
     * 获取数量字段
     *
     * @return countField
     */
    public String getCountField() {
        return countField;
    }

    /**
     * 获取影票相关枚举
     *
     * @return GoodsTypeEnum[]
     */
    public static GoodsTypeEnum[] getFilmTicketValues() {
        return new GoodsTypeEnum[]{FILM_TICKET, NET_SERVICE, ADD_SERVICE};
    }

    /**
     * 根据编码获取对应的枚举，没有匹配则返回null
     *
     * @param code 编码
     * @return this
     */
    public static GoodsTypeEnum getEnum(Object code) {
        if (code == null) {
            return null;
        }
        for (GoodsTypeEnum enumType : GoodsTypeEnum.values()) {
            if (enumType.compare(code)) {
                return enumType;
            }
        }
        return null;
    }

    /**
     * 比较，相同返回true，否则返回false
     *
     * @param codeOrEnum 编码或枚举
     * @return boolean
     */
    public boolean compare(Object codeOrEnum) {
        if (code == null) {
            return false;
        }
        if (codeOrEnum instanceof GoodsTypeEnum) {
            return this.compareTo((GoodsTypeEnum) codeOrEnum) == 0;
        } else if (codeOrEnum instanceof Number) {
            return this.code.compareTo((Byte) codeOrEnum) == 0;
        } else {
            return this.code.toString().equals(codeOrEnum);
        }
    }
}
